Application Optimization for NVIDIA Grace CPU

Lukas Krenz, Mathias Wagner, Sr. Developer Technology Engineer
| S72978 | GTC 2025

目录

  1. NVIDIA Grace CPU 基础
  2. 让您的工作负载运行起来
  3. 实现最佳性能
  4. 编译器
  5. 选择优化的数学库
  6. 性能分析
  7. 理解硬件:Grace 文档
  8. 硬件性能计数器
  9. 工具概览
  10. Perf stat
  11. Nsight Systems
  12. NVTX
  13. Nsight Systems - 核心指标
  14. Nsight Systems - Uncore 指标
  15. 识别热点 (Identify Hotspots
  16. Compiler Explorer – 理解你的编译器在做什么
  17. SIMD 编程方法 (SIMD Programming Approaches
  18. 编译器自动向量化 (Compiler Auto-vectorization
  19. Arm 内存模型 (Arm Memory Model
  20. 总结 (Summary

NVIDIA Grace CPU 基础

超级芯片的构建模块

Page 2 - NVIDIA Grace CPU 基础
Page 2 - NVIDIA Grace CPU 基础

让您的工作负载运行起来

Page 3 - 工作负载运行流程
Page 3 - 工作负载运行流程

实现最佳性能

复用他人的工作

Page 4 - 性能优化步骤
Page 4 - 性能优化步骤

编译器

Page 5 - 编译器及版本要求
Page 5 - 编译器及版本要求

选择优化的数学库

使用默认接口以实现性能可移植性

Page 6 - 优化数学库性能对比
Page 6 - 优化数学库性能对比

性能分析

Page 7 - 性能分析循环
Page 7 - 性能分析循环

理解硬件:Grace 文档

Page 8 - Grace 相关文档
Page 8 - Grace 相关文档

硬件性能计数器

工具概览

Perf stat

$ perf stat -I 100 -o perf.json --json \
-e 'duration_time,{nvidia_scf_pmu_0/cmem_rd_data/,nvidia_scf_pmu_0/cmem_wr_total_bytes/}'

Nsight Systems

时间线视图

Page 12 - Nsight Systems 时间线视图
Page 12 - Nsight Systems 时间线视图

NVTX

标记您的代码

Page 13 - 使用 NVTX 标记代码
Page 13 - 使用 NVTX 标记代码
#include <nvtx3/nvToolsExt.h>

void congrad_64()
{
    nvtxRangePush(__func__); // Range around the whole function

    for (int i = 0; i < 6; ++i)
    {
        nvtxRangePush("loop range"); // Range for iteration
        // Do ab iteration
        nvtxRangePop(); // End the inner range
    }

    nvtxRangePop(); // End the outer range
}

Nsight Systems - 核心指标

收集核心性能指标

Page 14 - Nsight Systems 核心指标视图
Page 14 - Nsight Systems 核心指标视图

使用以下命令查看可用的核心指标:
nsys profile --cpu-core-metrics=help

Nsight Systems - Uncore 指标

收集 uncore 性能指标

Page 15 - Nsight Systems Uncore 指标视图
Page 15 - Nsight Systems Uncore 指标视图

使用以下命令查看可用的套接字(socket)级别指标:
nsys profile --cpu-socket-metrics=help

识别热点 (Identify Hotspots)

链接:https://github.com/brendangregg/FlameGraph

火焰图示例
火焰图示例

Compiler Explorer – 理解你的编译器在做什么

链接:https://godbolt.org

该工具可以帮助开发者理解编译器对源代码所做的具体优化和转换,通过并排显示源代码、生成的汇编代码以及编译器优化后的代码,可以直观地看到向量化等优化的效果。

Compiler Explorer 界面展示,代码来自 HACCmk 基准测试
代码来自 Coral 基准测试套件的 HACCmk 基准测试,来源:https://asc.llnl.gov/coral-benchmarks

SIMD 编程方法 (SIMD Programming Approaches)

请按顺序遵循这些建议,例如,优先选择自动向量化而不是内联函数(intrinsics)。

SIMD编程方法层级图
SIMD编程方法层级图
  1. 编译器 (Compilers)

    • 自动向量化:NVIDIA, GCC, LLVM, ACI, Cray...
    • 编译器指令:例如 OpenMP
      • #pragma omp parallel for simd
      • #pragma vector always
  2. 库 (Libraries)

    • NVIDIA Math Libraries (NVPL)
    • Arm Performance Library (ArmPL)
    • 开源科学库 (BUS, FFTW, PETSc, etc.)
    • 库的类别包括:BLAS, LAPACK, PBLAS, SCALAPACK, TENSOR, SPARSE, RAND, FFTW
  3. 内联函数 (Intrinsics - ACLE)

  4. 汇编 (Assembly)

编译器自动向量化 (Compiler Auto-vectorization)

Arm 内存模型 (Arm Memory Model)

总结 (Summary)

主要 takeaways

也欢迎访问我们今天下午 3:00 – 3:50 PM 的 CWE:
如何在 NVIDIA Grace CPU 上运行和优化您的工作负载 [CWE73338]